package com.zhiwen.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhiwen.common.api.PageResult;
import com.zhiwen.domain.entity.Notification;

/**
 * 通知服务接口
 */
public interface NotificationService extends IService<Notification> {

    /**
     * 创建问题回答通知
     *
     * @param questionId 问题ID
     * @param answerId   回答ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void createQuestionAnsweredNotification(Long questionId, Long answerId, Long receiverId, Long senderId);

    /**
     * 创建回答评论通知
     *
     * @param answerId   回答ID
     * @param commentId  评论ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void createAnswerCommentedNotification(Long answerId, Long commentId, Long receiverId, Long senderId);

    /**
     * 创建回答被采纳通知
     *
     * @param questionId 问题ID
     * @param answerId   回答ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void createAnswerAcceptedNotification(Long questionId, Long answerId, Long receiverId, Long senderId);

    /**
     * 创建内容审核通知
     *
     * @param contentType 内容类型（1-问题，2-回答，3-评论）
     * @param contentId   内容ID
     * @param receiverId  接收者ID
     * @param result      审核结果
     * @param remark      备注
     */
    void createContentReviewedNotification(Integer contentType, Long contentId, Long receiverId, Integer result, String remark);

    /**
     * 创建系统通知
     *
     * @param title      标题
     * @param content    内容
     * @param receiverId 接收者ID（为null时发送给所有用户）
     */
    void createSystemNotification(String title, String content, Long receiverId);

    /**
     * 创建内容点赞通知
     *
     * @param contentType 内容类型（1-问题，2-回答，3-评论）
     * @param contentId   内容ID
     * @param receiverId  接收者ID
     * @param senderId    点赞者ID
     */
    void createContentLikedNotification(Integer contentType, Long contentId, Long receiverId, Long senderId);

    /**
     * 创建用户关注通知
     *
     * @param receiverId 被关注者ID
     * @param senderId   关注者ID
     */
    void createUserFollowedNotification(Long receiverId, Long senderId);

    /**
     * 获取用户未读通知数量
     *
     * @param userId 用户ID
     * @return 未读通知数
     */
    Long getUnreadCount(Long userId);

    /**
     * 获取用户通知列表（分页）
     *
     * @param userId   用户ID
     * @param isRead   已读状态（null表示全部）
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 通知列表
     */
    PageResult<Notification> getUserNotifications(Long userId, Integer isRead, Integer pageNum, Integer pageSize);

    /**
     * 标记通知为已读
     *
     * @param notificationId 通知ID
     * @param userId         用户ID
     * @return 是否成功
     */
    boolean markAsRead(Long notificationId, Long userId);

    /**
     * 标记用户所有通知为已读
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markAllAsRead(Long userId);

    /**
     * 删除通知
     *
     * @param notificationId 通知ID
     * @param userId         用户ID
     * @return 是否成功
     */
    boolean deleteNotification(Long notificationId, Long userId);
}
